#include "Linear_DDCLinkList.h"

//enum Status{OK=1,ERROR=-2,TRUE=1,FALSE=0,EMPTY=-1};
//
//typedef int ElemType;
//
//typedef struct LNode{//结点类型
//    ElemType * data;
//    struct LNode * next;
//}LNode;
//
//typedef struct LinkList{//链表类型
//    LNode* head;
//    LNode* tail;
//    int ListSize;
//}LinkList;
//
//typedef enum Status Status;
//
//Status ListInit(LinkList* L);//链表初始化  1
//Status DestroyList(LinkList* L);//链表销毁  1
//Status ClearList(LinkList* L);//清空链表  1
//Status InsertFirst(LinkList* L,LNode* s);//在第一个节点前插入  1
//LNode  DestroyFirst(LinkList* L);//销毁第一个节点  1
//Status Append(LinkList* LH,LinkList* LT);//将两个链表链接  1
//LNode  RemoveTail(LinkList* L);//移除最后一个节点  1
//Status InsertBefore(LinkList* L,LNode* p,LNode* s);//在p所指向的节点前插入  1
//Status InsertAfter(LinkList* L,LNode* p,LNode* s);//在p所指向的节点后插入  1
//Status SetCurElem(LNode* p,ElemType e);//设置p所指向的节点的值  1
//ElemType GetCurElem(LNode p);//获取p所指向的节点的值  1
//Status ListEmpty(LinkList L);//判断链表是否为空  1
//int ListLength(LinkList L);//获取链表长度  1
//LNode* GetHead(LinkList L);//获取头节点  1
//LNode* GetLast(LinkList L);//获取尾节点  1
//LNode* NextPos(LinkList L,LNode* p);//获取p所指向节点的下一个节点  1
//LNode* PriorPos(LinkList L,LNode* p);//获取p所指下一个节点  1
//LNode* LocatePos(LinkList L,int i);//获取第i个节点  1
//LNode* LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType));//获取元素e的位置  1
//Status ListTraverse(LinkList L,Status (*visit)(LNode* ));//链表遍历  1
//Status ListInsert_L(LinkList* L,int i,LNode* e);//在第i个节点前插入e  1
//Status ListPushBack(LinkList* L,LNode* e);//链表尾插  1

//Status LNodeInit(LNode* l);//节点初始化
//
//
//
//ElemType* CreatElem(int data);//创造一个元素  1
//Status List_Sort(LinkList* L,Status (*compare)(ElemType e,ElemType f));//对链表进行既定顺序的排序  1
//Status ListSelectSort(LinkList* L,Status (*compare)(ElemType e,ElemType f));//对链表进行既定顺序的选择排序  1
//
//Status ListRevers(LinkList* L);//链表的原地逆置  1

Status visit(LNode* l);
Status compareBig(ElemType e,ElemType f){
    if(e<f)
        return TRUE;
    else
        return FALSE;
}

Status compareSame(ElemType e,ElemType f);

int main(){

    LinkList l1;
    ListInit(&l1);

    for (int i = 0; i < 5; ++i) {
        int index,headnum;
//        printf("请输入第%d个结点的值: 指数 系数\n",i+1);
//        scanf("%d%d",&index,&headnum);
        LNode E;
        E.data= CreatElem(5-i);
        E.next=NULL;
        ListPushHead(&l1,E);
    }




    ListTraverse(l1,visit);
    printf("\n");

//    DestroyList(&l1);


//    ClearList(&l1);


//    LNode p;
//    p=DestroyFirst(&l1);
//    visit(&p);
//    printf("\n");


//    LNode P;
//    P.data= CreatElem(100);
//    P.next=NULL;
//    InsertFirst(&l1,P);


//    LinkList l2;
//    ListInit(&l2);
//
//    for (int i = 0; i < 7; ++i) {
//        int index,headnum;
////        printf("请输入第%d个结点的值: 指数 系数\n",i+1);
////        scanf("%d%d",&index,&headnum);
//        LNode E;
//        E.data= CreatElem(2*i);
//        E.next=NULL;
//        ListPushHead(&l2,E);
//    }
//    ListTraverse(l2,*visit);
//    printf("\n");
//
//    Append(&l1,&l2);


//    LNode p;
//    p=RemoveTail(&l1);
//    visit(&p);
//    printf("\n");



//    LNode p,*tmp=l1.head->next->next->next;
//    p.next=NULL;
//    p.data= CreatElem(999);
//    InsertBefore(&l1,tmp,p);

//    LNode p,*tmp=l1.head->next->next->next;
//    p.next=NULL;
//    p.data= CreatElem(999);
//    InsertAfter(&l1,tmp,p);


//    LNode *tmp=l1.head->next->next->next;
//    ElemType q= GetCurElem(*tmp);
//    printf("%d\n",q);

//    LNode *tmp=l1.head->next->next;
//    ElemType *q=CreatElem(999);
//    SetCurElem(tmp,(*q));

//    if(ListEmpty(l1))
//        printf("Empty!\n");
//    else
//        printf("None empty!\n");

//    printf("List Length:%d\n", ListLength(l1));
//
//    printf("Function Head:%d\tList Head:%d\n", GetHead(l1),l1.head->next);
//    printf("Function Tail:%d\tList Tail:%d\n", GetLast(l1),l1.tail);


//    LNode* p=l1.head->next->next,*tmp;
//    tmp=PriorPos(l1,p);
//    visit(tmp);
//    printf("\n");

//    LNode* p=l1.head->next->next,*tmp;
//    tmp= NextPos(l1,p);
//    visit(tmp);
//    printf("\n");


//    ElemType e;
//    e=3;
//    LNode* tp= LocateElem(l1,e,(compareSame));
//    visit(tp);
//    printf("\n");


//    LNode * tp;
//    tp=LocatePos(l1,3);
//    visit(tp);
//    printf("\n");


    LNode p;
    p.next=NULL;
    p.data= CreatElem(999);
    ListInsert_L(&l1,6,p);


//    List_Sort(&l1,(compareBig));

//    ListSelectSort(&l1,compareBig);

//    ListRevers(&l1);

    ListTraverse(l1,(visit));




    return 0;
}

Status visit(LNode* l){
    if(l==NULL)
        return ERROR;
//    printf("Data is:%d\tMy Address:%d\t Next Address:%d\tPrior Address:%d\n",*l->data,l,l->next,l->prior);
    printf("Data is:%d\t My Address:%d\t Next Address:%d\tPrior Address:%d\n",*l->data,l,l->next,l->prior);
    return OK;
}


Status compareSame(ElemType e,ElemType f){
    if(e==f)
        return TRUE;
    else
        return FALSE;
}

